// @import
import { __doAttk } from "./HeroCtrl.__doAttk";
import { __doDamage } from "./HeroCtrl.__doDamage";
import { __doDie } from "./HeroCtrl.__doDie";
import { __moveTo } from "./HeroCtrl.__moveTo";

// @const
const { ccclass, } = cc._decorator;

/**
 * 游戏场景
 */
@ccclass
export default class HeroCtrl extends cc.Component {
    /**
     * 用户 Id
     */
    _nUserId: number;

    /**
     * 用户名称
     */
    _strUserName: string;

    /**
     * 最大血量
     */
    _nMaxHP: number = 0;

    /**
     * 当前血量
     */
    _nCurrHP: number = 0;

    /**
     * 移动协程 ID
     */
    _strMoveTo_XCID: string = null;

    /**
     * 最近的英雄节点集合
     */
    readonly _oClosesetHeroNodeMap: Map<string, cc.Node> = new Map();

    /**
     * 移动到指定位置
     * 
     * @param oToWorldPos 世界位置
     */
    moveTo(oToWorldPos: cc.Vec2): void {
        __moveTo(this, oToWorldPos);
    }

    /**
     * 执行攻击
     * 
     * @param out_oTargetUserIdArray ( 输出参数 ) 目标用户 Id 数组
     */
    doAttk(out_oTargetUserIdArray: Array<number> = null): void {
        __doAttk(this, out_oTargetUserIdArray);
    }

    /**
     * 执行伤害
     * 
     * @param nSubtractHP 减血量
     */
    doDamage(nSubtractHP: number): void {
        __doDamage(this, nSubtractHP);
    }

    /**
     * 执行死亡
     */
    doDie(): void {
        __doDie(this);
    }

    /**
     * onCollisionEnter
     * 
     * @param oAnotherBox 另外一个碰撞盒
     * @param oMyBox 我的碰撞盒
     */
    onCollisionEnter(oAnotherBox: cc.BoxCollider, oMyBox: cc.BoxCollider): void {
        if (null == oAnotherBox || 
            null == oMyBox) {
            return;
        }

        this._oClosesetHeroNodeMap.set(
            oAnotherBox.node.uuid, oAnotherBox.node
        );
    }

    /**
     * onCollisionExit
     * 
     * @param oAnotherBox 另外一个碰撞盒
     * @param oMyBox 我的碰撞盒
     */
    onCollisionExit(oAnotherBox: cc.BoxCollider, oMyBox: cc.BoxCollider): void {
        if (null == oAnotherBox || 
            null == oMyBox) {
            return;
        }

        this._oClosesetHeroNodeMap.delete(oAnotherBox.node.uuid);
    }
}

// @export
// @const
export const g_oHeroCtrlMap: Map<number, HeroCtrl> = new Map();
